package org.enea.xlab.lezione3.crudmanager;

import java.io.Serializable;
import java.util.HashMap;

import javax.annotation.PostConstruct;
import javax.ejb.Stateful;

import org.enea.xlab.lezione3.entity.Supplier;
import org.jboss.annotation.ejb.Service;


/**
 * @author X-Lab
 * 
 * @fab classe di prova
 * tale classe non puo funzionare da singleton
 * quindi  alla creazione di più istanze dello stateless, l'ignezione potrebbe creare una nuova istanza di tale
 * bean andando a creare più domini paralleli.
 * 
 * Ma anche  usando lo stateful come facade, per ogni client il container creera' una nuva istanza stateful, con associata creazione 
 * di nuovo dominio parallelo.
 * 
 * L'unica soluzione e' creare un singleton ed, apparte soluzioni di classi statiche innestate
 * che potrebbero violare il contratto del container , in jboss la soluzione è il Service
 * 
 * JEE6 mette a disposizione l'annotazione @Singleton per risolvere il problema
 */
@Service
@Stateful
public class CRUDManagerImpl implements CRUDManagerLocal, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	//private  HashMap<Long, Supplier> suppliersRegister=new HashMap<Long, Supplier>();
	private  HashMap<Long, Supplier> suppliersRegister;
	
	/**
	 * il metodo taggato PostConstruct viene invocato dal container una sola volta
	 * dopo la costruzione dell'EJB 
	 * ma prima di qualsiasi altra chiamata ai metodi 
	 * 
	 * L'inizializzazione in postconstruct 
	 * rispetta le specifiche jEE5 sul contratto del container
	 * 
	 */
	@PostConstruct
	private void init()
	{
		suppliersRegister=new HashMap<Long, Supplier>();
		System.out.println("Costruito dominio!!!");
		System.out.flush();
	}
	
	/**
	 * return null se gia' esiste
	 *        altrimenti ritorna l'id dell'oggetto creato nel dominio 
	 *        
	 */
	public synchronized Long createSupplier(Supplier supplier) {
		
		if ( suppliersRegister.containsKey(supplier.getSupplierId()) )
		return null;

		suppliersRegister.put(supplier.getSupplierId(), supplier);

		return supplier.getSupplierId();
	}

	public synchronized Supplier readSupplier(Long supplierId) {
		
		return suppliersRegister.get(supplierId);
	}

	
	/**
	 * 
	 *
	 *  return true se l'oggetto esiste e l' upgrade e' andato buon fine
	 *         false in caso l'ogetto non esista nel dominio e quindi 
	 */
	public synchronized Boolean updateSupplier(Supplier supplier) {
		
		if (! suppliersRegister.containsKey(supplier.getSupplierId()))
			return false;
		
				suppliersRegister.put(supplier.getSupplierId(), supplier) ;
			
		
		return true;
	}

	/**
	 * return false quando non cancella nulla
	 */
	public synchronized Boolean deleteSupplier(Long supplierId) {
		
		if ( suppliersRegister.remove(supplierId) == null )
			return false;
		
		return true;
	}
	
	public HashMap getRegister()
	{
		return suppliersRegister;
	}
}
